package com.softeem.sanguo;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 游戏的主面板（游戏元素呈现舞台，绘制游戏元素以及实现用户交互操作）
 * 地图
 * 玩家
 * 敌人
 * 道具
 * 子弹
 * ...
 */
public class GamePanel extends JPanel {

    //新建玩家对象
    Hero hero = new Hero(this);
    //初始化地图索引
    int mapIndex = 0;
    //初始游戏状态
    boolean playing = true;
    //声明容器存储所有产生敌人
    CopyOnWriteArrayList<Enemy> enemies = new CopyOnWriteArrayList<>();
    //声明容器存储所有掉落的道具
    CopyOnWriteArrayList<Food> foods = new CopyOnWriteArrayList<>();

    GameWindow gameWindow;

    //构造器
    public GamePanel(GameWindow gameWindow) {
        this.gameWindow = gameWindow;
        //播放背景音乐
        Utils.playMusic("bg.mp3",true);
        //设置当前面板获得焦点
        setFocusable(true);
        //为面板绑定按键事件
        addKeyListener(new KeyAdapter() {
            //定义无序集合（避免重复元素）  - 哈希(数据结构)
            HashSet<Integer> set = new HashSet<>();

            //按键按下时触发
            @Override
            public void keyPressed(KeyEvent e) {
                //获取当前按下的按键码（ASCII码）
                int code = e.getKeyCode();
                //将按下的按键码记录到集合
                set.add(code);
                //控制玩家行为（移动，攻击，...）  java8 lambda表达式
                set.forEach(key -> {
                    hero.control(key);
                });
            }

            //按键松开时触发
            @Override
            public void keyReleased(KeyEvent e) {
                //当按键松开时从集合中移除按键码
                set.remove(e.getKeyCode());
            }
        });

        //启动界面重绘线程（定时执行界面重绘）
        new Thread(() -> {
            //循环执行
            while (playing) {
                //重绘界面
                repaint();
                try {
                    //线程暂停17毫秒
                    Thread.sleep(17);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }).start();

        //启动敌人制造线程
        new Thread(() -> {
            while (playing) {
                //创建敌人对象
                Enemy e = new Enemy(GamePanel.this);
                //创建线程并实现敌人移动（启动线程）
                new Thread(e).start();
                //敌人存储到容器，等待绘制
                enemies.add(e);
                try {
                    //间隔1~3秒产生1个敌人
                    Thread.sleep(Utils.randomNum(1000, 3000));
                } catch (InterruptedException ex) {
                    throw new RuntimeException(ex);
                }
            }
        }).start();
    }

    //切换上一张地图
    public void prevMap() {
        mapIndex--;
        if (mapIndex < 0) {
            mapIndex = 0;
        }else{
            enemies.clear();
        }
    }

    //切换下一张地图
    public void nextMap() {
        mapIndex++;
        if (mapIndex > Images.maps.length - 1) {
            mapIndex = Images.maps.length - 1;
        }else{
            enemies.clear();
        }
    }

    /**
     * 面板中所有元素的绘制均通过以下方法实现
     *
     * @param g the <code>Graphics</code> context in which to paint
     */
    @Override
    public void paint(Graphics g) {
        //绘制地图到面板中
        g.drawImage(Images.maps[mapIndex], 0, 0, Config.SC_WIDTH, Config.SC_HEIGHT, null);
        //绘制玩家到面板中
        hero.draw(g);
        //绘制篮球
        hero.balls.forEach(b -> b.draw(g));
        //绘制敌人
        enemies.forEach(e -> e.draw(g));
        //绘制道具
        foods.forEach(f -> f.draw(g));
    }
}

